/***************************************************************************************************
  Copyright(C)   2011-9-5
  All rights reserved.
  File Name: clientservice.h

  Description:配置文件处理块
              主要进行从配置文件中读取配置信息和将最新的配置信息更新到配置文件中

  ***************************************************************************************************/

#ifndef CONFIGURATCLASS_H
#define CONFIGURATCLASS_H

#include <QSettings>
#include <QDebug>
#include <QFile>
#include <QStringList>
#include <QList>
#include <QMap>
#include <QDateTime>
#include <QApplication>
#include <QProcess>
#include <QObject>
#include <QDir>

#ifdef _TTY_POSIX_
#include <time.h>
#endif

#include "environment.h"

#define SLCD_MAX_COUNT 6

extern QString g_installPath;
extern QString g_AppPath;

//slcd的版本类型，有beta版本和release版本
typedef enum _VERSION_E{
    VERSION_BTEA = 0,
    VERSION_RELEASE = 1
} VERSIONTYPE_E;

typedef struct LCDBRIGHTLEVELSTRUCT{
   qint16 envirStart;
   qint16 envirEnd;
   qint16 lcdBirght;
} LcdBriLVStruct;

//SLCD 信息结构体，包括ID号和是否收集信息标志
typedef struct PANELINFO{
    quint16 panelID;
    qint16  isCollect;          //是否收集SLCD的信息
    qint16  lcdBirght;          //是否收集SLCD的信息
} PanelInfoStruct;

//slcd version结构体,比如版本2.3.0，存放格式就为version1.version2.version3
//version1 = 2, version2 = 3. version3 = 0;
typedef struct VERSIONINFO{
    VERSIONTYPE_E enVersionType;    //版本类型，有测试版本有发布版本
    qint16 version1;
    qint16 version2;          //
    qint16 version3;          //
    QString schedulePro;      //播放列表项目名
    qint64 resourceSize;      //播放资源大小
} VersionInfo;

typedef struct CONFIGSTRUCT{
    qint16 defaultLv;             //默认LCD屏的亮度等级
//    qint16 contrast;            //对比度
//    QString color;              //颜色 一般格式为RGB(100:200:300)
//    qint32 transformValue;      //环境光度转化为LCD亮度的转化值
    quint16 carNum;             //车厢号
    quint16 carSide;            //当前位置
//    QString systemDate;       //系统日期 格式为y:m:d(2011.10.01)
//    QString systemTime;       //系统时间 格式为h:m:s(20:10:12)
    LcdBriLVStruct lvStruct[4];
    QDate systemDate;
    QTime systemTime;
    qint8 scrollSpeed;          //滚动文字的滚动速度
    qint16 cpuLimmit;           //cpu
    qint16 memoryLimmit;        //内存
    qint16 hardDiskLimmit;      //硬盘
    qint16 limmit;              //安全下限
    qint16 isMastDev;           //是否主设备
    qint16 logReserveDays;      //日志保留天数
    qint16 isReplortSlcd;       //是否上报SLCD情况给TIS
    VersionInfo versionInfo;    //版本信息，包含SLCD版本和播放列表的信息
    QString masterDevIp;        //主设备IP
    int bcInfoTime;             //开机播放本机信息时间，本机信息有ip等
    int isCollectPS;            //是否收集环境光度
} ConfigStruct;


typedef struct LCDSETTINGSTRUCT{
    qint16 brightness;          //亮度
    qint16 defaultLv;
//    qint16 contrast;            //对比度
//    QString color;              //颜色 一般格式为RGB(100:200:300)
//    int transformValue;         //环境光度转化为LCD亮度的转化值
    qint8 backLightStatus;        //背景灯光状态,1为打开, 0为关闭
//    double lcdK;
    LcdBriLVStruct lvStruct[4];
    int collectPanelCount;      //要收集的SLCD屏的数量
    int isCollectPS;            //是否要收集环境光度,如果不收集那么LCD屏亮度设置默认亮度
    QList<PanelInfoStruct> panelInfoList;
} LcdSettingStruct;

typedef enum{
    LCDSTATU_BRIGHTNESS_TYPE    = 1,            //亮度设置
    LCDSTATU_VIDEO_TYPE         = 2,            //视频状态
    LCDSTATU_BACKLIGHT_TYPE     = 3,            //背景灯设置
    LCDSTATU_ISCOLLECT_TYPE     = 4             //
} LcdStatuType_E;

typedef struct{
    LcdStatuType_E  enLcdStatuType;
    quint16    panelID;                 //收到的LCD回复
    quint16    brightness;
    qint16     videoStatus;
    quint8     blStatus;
    quint16    isCollect;
} LCDSTATUS;

typedef struct _DEBUG_CONFIG_S{
    bool isDebugSerialPort;
    bool isDebugTisCtl;
} Debug_Config_s;

class Configclass
{
public:
    Configclass();
//    ~Configclass();

    //设置默认配置
    void setDefaultConfigValue();    

    //将当前配置保存成默认配置
    qint8 saveAsDefaultconfig();
    //将配置恢复成默认配置
    qint8 restoreDefaultConfig();

    int     IsMasterDev() const ;
    void setMasterDev(int isMasterDev);

//    QString getMaterIp() const;
    int showScreenIndex() const;
    QString getSysCom() const;
    int getSysBaud() const;
    int getReplortState() const;

    QString getSysFont() const;
    int getSysReserveDays() const;
    int getBroadcastInfoTime() const;
    QString getSlcdVersion() const;
    QString getScheduleProName() const;
    QString getScheduleVersion() const;
    qint64 getResourceSize() const;
    QString getConfigPort();
    QString getUpdatePort() const;
    QString getBindIP();
    int getCarNum() const;
    int getCarSide() const;
    QString getCarSideStr() const;

    QString getTISCom() const;
    int getTISBaud() const;
    QStringList getFsmList() const;


    QString getSystemDate() const;
    QString getSystemTime() const;

    int getCputLimmit() const;
    int getMemoryLimmit() const;
    int getHardDiskLimmit() const;

//    QStringList getLCDIDStrList();
    QList<PanelInfoStruct> getSLCDInfoIntList();
//    QList<quint16> getLCDIDIntList();
    PanelInfoStruct getSLCDInfo(const int num);
    int collectSLCDCount();

    QString getLCDID() const;
    int getLcdDefaultLV() const;
    int getLCDCcontrast() const;
    QString getLCDColor() const;
    int getLcdTransformValue() const;
    QString getPhotoSensorCom() const;
    int getPhotoSensorBaud() const;
    int getIsCollectPS();
    void setSlcdVersion(const QString& version) const;
    QString getLcdCom() const;
    int getLcdBaud() const;
    int getScrollSpeed() const;

    double getPhoToBrightK() const;
    bool getSendIsAscii() const;
    LcdBriLVStruct getLv1Bright() const;
    LcdBriLVStruct getLv2Bright() const;
    LcdBriLVStruct getLv3Bright() const;
    LcdBriLVStruct getLv4Bright() const;


    int getAckCEPort();
    int getReceCEPort();

    bool getDebugSerialPort();          //得到是否打印串口信息
    bool getDebugTisCtl();              //是否打印TIS处理信息


//==============================================================

    void setScheduleProName(const QString& proName) const;
    void setScheduleVersion(const QString& version);
    void setResourceSize(const qint64 size) const;
    void setConfigPort(const int port);
    void setBindIP(const QString& ip);
    void setCarNum(const int carrageNum) const;
    void setCarSide(const int position) const;
    void setSystemDate(const QString& date) const;
    void setSystemTime(const QString& time) const;
    void setCputLimmit(const int cpuLimmit) const;
    void setMemoryLimmit(const int memoryLimmit) const;
    void setHardDiskLimmit(const int hardDiskLimmit) const;
    void setLCDID(const QString& ID) const;
    void setLCDIDList(const QStringList& IDList) const;
    void setLcdDefaultLV(const int lv) const;
    void setLCDCcontrast(const int contrast) const;
    void setLCDColor(const QString& color) const;
    void setLcdTransformValue(const int transformValue) const;
    void setEnvirCom(const QString& com) const;
    void setLcdCom(const QString& com) const;
    void setScrollSpeed(const int speed) const;


    void setLv1Bright(const LcdBriLVStruct& lvStruct);
    void setLv2Bright(const LcdBriLVStruct& lvStruct);
    void setLv3Bright(const LcdBriLVStruct& lvStruct);
    void setLv4Bright(const LcdBriLVStruct& lvStruct);

    void addLCDIDList(const QStringList& IDList) const;
    void addLCDID(const QString& ID) const;

    void delLCDIDList(const QStringList& IDList) const;
    void delLCDID(const QString& ID) const;

    void setSlcdInfo(const QList<PanelInfoStruct>& infoList);




    //设置一个QString型配置信息的值 group格式(类别/属性 state/position)
    void setConfigValueStr(const QString& group, const QString& strValue);

    //设置一个int型配置信息的值  group格式(类别/属性 state/position)
    void setConfigValueInt(const QString& group, int iValue);

    //取得一个QString型配置信息的值
    QString getConfigValueStr(const QString& group) const;

    //取得一个int型配置信息的值
    int getConfigValueInt(const QString& group) const;

    QMap<QString, int> getAllConfigMap();

    ConfigStruct getConfigStruct() const;
    bool setConfig(const ConfigStruct& configStruct);

    //同步，将修改的配置更新到文件中
    void sync();
private:
    QSettings *settings;            //配置类


private:
    void init();



};

#endif // CONFIGURATCLASS_H
